package test.com.sky.properties;

import com.sky.JULLog.MyLogger;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.EventListener;
import java.util.logging.Logger;

/**
 * @author : wushikai
 * <p>
 * date : 2022-05-30
 */

class EventSource {


    private  static Logger log  = MyLogger.getLogger(EventSource.class);

    private String name;

    private  String password ;


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    /*
     * 在事件源的地方添加一个PropertyChangeSupport对象，间接地由它负责添加监听、激发事件
     */
    private PropertyChangeSupport listeners = new PropertyChangeSupport(this);

    /**
     * 在事件源上添加监听，实际上是在PropertyChangeSupport对象上添加监听
     */
    void addListener(PropertyChangeListener listener) {
        listeners.addPropertyChangeListener(listener);
    }

    /**
     * 同上
     */
    public void removeListener(PropertyChangeListener listener) {
        listeners.removePropertyChangeListener(listener);
    }

    private String getName() {
        return name;
    }

    /**
     * 事件源发生变化时，也是通过PropertyChangeSupport对象把事件发送到监听者上的
     */
    void setName(String name) {
        this.name = name;
        listeners.firePropertyChange(EventSource.class.getCanonicalName(),
                "old", getName()); // 触发事件源，监听者得到触发变化
    }
}
/**
 *
 * 每当bean更改“绑定”属性时，都会触发“PropertyChange”事件。
 * 您可以向源bean注册PropertyChangeListener，以便在任何绑定属性更新时得到通知。
 * */
class Monitor implements PropertyChangeListener {
    private  static Logger log  = MyLogger.getLogger(Monitor.class);
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
       log.warning("事件源 发生变化，请做相应处理！");

       log.info(evt.getPropertyName());
       log.info(evt.getOldValue().toString());
       log.info(evt.getNewValue().toString());


    }
}

class TestPropertyChangeSupport {


    public static void main(String[] args) {
        EventSource eventSource = new EventSource();
        Monitor monitor = new Monitor();
        //在事件源上添加监听，发生变化时就会调用propertyChange方法
        eventSource.addListener(monitor);
        eventSource.setName("new");
        eventSource.setPassword("123456");


    }
}
